<?php
namespace zake\helper;
/**
 * Class Bit64
 * 将一个数字打包成64为整形
 *
 * 实现原理：
 *  将64位整数按位 拆分成两个32位整数
 *
 * 方式：
 *
 * 1:第一步：将num拆分成 $upper 和 lower
 * Bit64::splitToBit32($upper, $lower, $num);
 *
 * 2:第二步：使用两个数字打包
 * $buffer = pack('NN', $upper, $lower); // 大端序
 *
 * 3:第三步：解包
 * $result = unpack('Nupper/Nlower',$buffer);
 * $result['upper']
 * $result['lower']
 *
 * 4:第四步：合并
 * Bit64::mergeToBit64($upper, $lower)
 */
class Bit64
{

    const BIGINT_DIVIDER = 0x7fffffff + 1;


    /**
     * 拆分
     * @param $upper
     * @param $lower
     * @param $value
     *
     * @author
     */
    public static function splitToBit32(&$upper, &$lower, $value) {
        $lower = intval($value % self::BIGINT_DIVIDER);
        $upper = intval(($value - $lower) / self::BIGINT_DIVIDER);
    }


    /**
     * 合并
     * @param $upper
     * @param $lower
     * @return float|int
     *
     * @author liu.bin 2020-03-24 15:18
     */
    function mergeToBit64($upper, $lower) {
        return $upper * self::BIGINT_DIVIDER + $lower;
    }



}